home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / test / test_long.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  17KB  |  575 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. from test.test_support import verify, verbose, TestFailed, fcmp
  5. from string import join
  6. from random import random, randint
  7. SHIFT = 15
  8. BASE = 2 ** SHIFT
  9. MASK = BASE - 1
  10. KARATSUBA_CUTOFF = 70
  11. MAXDIGITS = 15
  12. special = map(long, [
  13.     0,
  14.     1,
  15.     2,
  16.     BASE,
  17.     BASE >> 1])
  18. special.append(0x5555555555555555L)
  19. special.append(0xAAAAAAAAAAAAAAAAL)
  20. p2 = 0x4L
  21. for i in range(2 * SHIFT):
  22.     special.append(p2 - 1)
  23.     p2 = p2 << 1
  24.  
  25. del p2
  26. special = special + map((lambda x: ~x), special) + map((lambda x: -x), special)
  27.  
  28. def check(ok, *args):
  29.     if not ok:
  30.         raise TestFailed, join(map(str, args), ' ')
  31.     
  32.  
  33.  
  34. def getran(ndigits):
  35.     verify(ndigits > 0)
  36.     nbits_hi = ndigits * SHIFT
  37.     nbits_lo = (nbits_hi - SHIFT) + 1
  38.     answer = 0x0L
  39.     nbits = 0
  40.     r = int(random() * SHIFT * 2) | 1
  41.     while nbits < nbits_lo:
  42.         bits = (r >> 1) + 1
  43.         bits = min(bits, nbits_hi - nbits)
  44.         None(verify if bits <= bits else bits <= SHIFT)
  45.         nbits = nbits + bits
  46.         answer = answer << bits
  47.         if r & 1:
  48.             answer = answer | (1 << bits) - 1
  49.         
  50.         r = int(random() * SHIFT * 2)
  51.     None(verify if nbits <= nbits else nbits <= nbits_hi)
  52.     if random() < 0.5:
  53.         answer = -answer
  54.     
  55.     return answer
  56.  
  57.  
  58. def getran2(ndigits):
  59.     answer = 0x0L
  60.     for i in range(ndigits):
  61.         answer = answer << SHIFT | randint(0, MASK)
  62.     
  63.     if random() < 0.5:
  64.         answer = -answer
  65.     
  66.     return answer
  67.  
  68.  
  69. def test_division_2(x, y):
  70.     (q, r) = divmod(x, y)
  71.     q2 = x // y
  72.     r2 = x % y
  73.     pab = x * y
  74.     pba = y * x
  75.     check(pab == pba, 'multiplication does not commute for', x, y)
  76.     check(q == q2, 'divmod returns different quotient than / for', x, y)
  77.     check(r == r2, 'divmod returns different mod than % for', x, y)
  78.     check(x == q * y + r, 'x != q*y + r after divmod on', x, y)
  79.     if y > 0:
  80.         None(check if r <= r else r < y, 'bad mod from divmod on', x, y)
  81.     elif r < r:
  82.         pass
  83.     
  84.     check(r <= 0, 'bad mod from divmod on', x, y)
  85.  
  86.  
  87. def test_division(maxdigits = MAXDIGITS):
  88.     if verbose:
  89.         print 'long / * % divmod'
  90.     
  91.     digits = range(1, maxdigits + 1) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 14)
  92.     digits.append(KARATSUBA_CUTOFF * 3)
  93.     for lenx in digits:
  94.         x = getran(lenx)
  95.         for leny in digits:
  96.             if not getran(leny):
  97.                 pass
  98.             y = 0x1L
  99.             test_division_2(x, y)
  100.         
  101.     
  102.  
  103.  
  104. def test_karatsuba():
  105.     if verbose:
  106.         print 'Karatsuba'
  107.     
  108.     digits = range(1, 5) + range(KARATSUBA_CUTOFF, KARATSUBA_CUTOFF + 10)
  109.     digits.extend([
  110.         KARATSUBA_CUTOFF * 10,
  111.         KARATSUBA_CUTOFF * 100])
  112.     bits = [ digit * SHIFT for digit in digits ]
  113.     for abits in bits:
  114.         a = (0x1L << abits) - 1
  115.         for bbits in bits:
  116.             b = (0x1L << bbits) - 1
  117.             x = a * b
  118.             y = ((0x1L << abits + bbits) - (0x1L << abits) - (0x1L << bbits)) + 1
  119.             check(x == y, 'bad result for', a, '*', b, x, y)
  120.         
  121.     
  122.  
  123.  
  124. def test_bitop_identities_1(x):
  125.     check(x & 0 == 0, 'x & 0 != 0 for', x)
  126.     check(x | 0 == x, 'x | 0 != x for', x)
  127.     check(x ^ 0 == x, 'x ^ 0 != x for', x)
  128.     check(x & -1 == x, 'x & -1 != x for', x)
  129.     check(x | -1 == -1, 'x | -1 != -1 for', x)
  130.     check(x ^ -1 == ~x, 'x ^ -1 != ~x for', x)
  131.     check(x == ~~x, 'x != ~~x for', x)
  132.     check(x & x == x, 'x & x != x for', x)
  133.     check(x | x == x, 'x | x != x for', x)
  134.     check(x ^ x == 0, 'x ^ x != 0 for', x)
  135.     check(x & ~x == 0, 'x & ~x != 0 for', x)
  136.     check(x | ~x == -1, 'x | ~x != -1 for', x)
  137.     check(x ^ ~x == -1, 'x ^ ~x != -1 for', x)
  138.     None(check if 1 + ~x == 1 + ~x else 1 + ~x == ~(x - 1), 'not -x == 1 + ~x == ~(x-1) for', x)
  139.     for n in range(2 * SHIFT):
  140.         p2 = 0x2L ** n
  141.         check(x << n >> n == x, 'x << n >> n != x for', x, n)
  142.         check(x // p2 == x >> n, 'x // p2 != x >> n for x n p2', x, n, p2)
  143.         check(x * p2 == x << n, 'x * p2 != x << n for x n p2', x, n, p2)
  144.         None(check if (x >> n) << n == (x >> n) << n else (x >> n) << n == x & ~(p2 - 1), 'not x & -p2 == x >> n << n == x & ~(p2 - 1) for x n p2', x, n, p2)
  145.     
  146.  
  147.  
  148. def test_bitop_identities_2(x, y):
  149.     check(x & y == y & x, 'x & y != y & x for', x, y)
  150.     check(x | y == y | x, 'x | y != y | x for', x, y)
  151.     check(x ^ y == y ^ x, 'x ^ y != y ^ x for', x, y)
  152.     check(x ^ y ^ x == y, 'x ^ y ^ x != y for', x, y)
  153.     check(x & y == ~(~x | ~y), 'x & y != ~(~x | ~y) for', x, y)
  154.     check(x | y == ~(~x & ~y), 'x | y != ~(~x & ~y) for', x, y)
  155.     check(x ^ y == (x | y) & ~(x & y), 'x ^ y != (x | y) & ~(x & y) for', x, y)
  156.     check(x ^ y == x & ~y | ~x & y, 'x ^ y == (x & ~y) | (~x & y) for', x, y)
  157.     check(x ^ y == (x | y) & (~x | ~y), 'x ^ y == (x | y) & (~x | ~y) for', x, y)
  158.  
  159.  
  160. def test_bitop_identities_3(x, y, z):
  161.     check(x & y & z == x & y & z, '(x & y) & z != x & (y & z) for', x, y, z)
  162.     check(x | y | z == x | y | z, '(x | y) | z != x | (y | z) for', x, y, z)
  163.     check(x ^ y ^ z == x ^ y ^ z, '(x ^ y) ^ z != x ^ (y ^ z) for', x, y, z)
  164.     check(x & (y | z) == x & y | x & z, 'x & (y | z) != (x & y) | (x & z) for', x, y, z)
  165.     check(x | y & z == (x | y) & (x | z), 'x | (y & z) != (x | y) & (x | z) for', x, y, z)
  166.  
  167.  
  168. def test_bitop_identities(maxdigits = MAXDIGITS):
  169.     if verbose:
  170.         print 'long bit-operation identities'
  171.     
  172.     for x in special:
  173.         test_bitop_identities_1(x)
  174.     
  175.     digits = range(1, maxdigits + 1)
  176.     for lenx in digits:
  177.         x = getran(lenx)
  178.         test_bitop_identities_1(x)
  179.         for leny in digits:
  180.             y = getran(leny)
  181.             test_bitop_identities_2(x, y)
  182.             test_bitop_identities_3(x, y, getran((lenx + leny) // 2))
  183.         
  184.     
  185.  
  186.  
  187. def slow_format(x, base):
  188.     if (x, base) == (0, 8):
  189.         return '0L'
  190.     
  191.     digits = []
  192.     sign = 0
  193.     if x < 0:
  194.         sign = 1
  195.         x = -x
  196.     
  197.     while x:
  198.         (x, r) = divmod(x, base)
  199.         digits.append(int(r))
  200.     digits.reverse()
  201.     if not digits:
  202.         pass
  203.     digits = [
  204.         0]
  205.     return '-'[:sign] + {
  206.         8: '0',
  207.         10: '',
  208.         16: '0x' }[base] + join(map((lambda i: '0123456789ABCDEF'[i]), digits), '') + 'L'
  209.  
  210.  
  211. def test_format_1(x):
  212.     atol = atol
  213.     import string
  214.     for base, mapper in ((8, oct), (10, repr), (16, hex)):
  215.         got = mapper(x)
  216.         expected = slow_format(x, base)
  217.         check(got == expected, mapper.__name__, 'returned', got, 'but expected', expected, 'for', x)
  218.         check(atol(got, 0) == x, 'atol("%s", 0) !=' % got, x)
  219.     
  220.     got = str(x)
  221.     expected = slow_format(x, 10)[:-1]
  222.     check(got == expected, mapper.__name__, 'returned', got, 'but expected', expected, 'for', x)
  223.  
  224.  
  225. def test_format(maxdigits = MAXDIGITS):
  226.     if verbose:
  227.         print 'long str/hex/oct/atol'
  228.     
  229.     for x in special:
  230.         test_format_1(x)
  231.     
  232.     for i in range(10):
  233.         for lenx in range(1, maxdigits + 1):
  234.             x = getran(lenx)
  235.             test_format_1(x)
  236.         
  237.     
  238.  
  239.  
  240. def test_misc(maxdigits = MAXDIGITS):
  241.     if verbose:
  242.         print 'long miscellaneous operations'
  243.     
  244.     import sys as sys
  245.     hugepos = sys.maxint
  246.     hugeneg = -hugepos - 1
  247.     hugepos_aslong = long(hugepos)
  248.     hugeneg_aslong = long(hugeneg)
  249.     check(hugepos == hugepos_aslong, 'long(sys.maxint) != sys.maxint')
  250.     check(hugeneg == hugeneg_aslong, 'long(-sys.maxint-1) != -sys.maxint-1')
  251.     
  252.     try:
  253.         check(int(hugepos_aslong) == hugepos, 'converting sys.maxint to long and back to int fails')
  254.     except OverflowError:
  255.         raise TestFailed, 'int(long(sys.maxint)) overflowed!'
  256.  
  257.     
  258.     try:
  259.         check(int(hugeneg_aslong) == hugeneg, 'converting -sys.maxint-1 to long and back to int fails')
  260.     except OverflowError:
  261.         raise TestFailed, 'int(long(-sys.maxint-1)) overflowed!'
  262.  
  263.     x = hugepos_aslong + 1
  264.     
  265.     try:
  266.         y = int(x)
  267.     except OverflowError:
  268.         raise TestFailed, "int(long(sys.maxint) + 1) mustn't overflow"
  269.  
  270.     if not isinstance(y, long):
  271.         raise TestFailed('int(long(sys.maxint) + 1) should have returned long')
  272.     
  273.     x = hugeneg_aslong - 1
  274.     
  275.     try:
  276.         y = int(x)
  277.     except OverflowError:
  278.         raise TestFailed, "int(long(-sys.maxint-1) - 1) mustn't overflow"
  279.  
  280.     if not isinstance(y, long):
  281.         raise TestFailed('int(long(-sys.maxint-1) - 1) should have returned long')
  282.     
  283.     
  284.     class long2(long):
  285.         pass
  286.  
  287.     x = long2(0x1L << 100)
  288.     y = int(x)
  289.     if type(y) is not long:
  290.         raise TestFailed('overflowing int conversion must return long not long subtype')
  291.     
  292.  
  293.  
  294. def test_auto_overflow():
  295.     import math as math
  296.     import sys
  297.     if verbose:
  298.         print 'auto-convert int->long on overflow'
  299.     
  300.     special = [
  301.         0,
  302.         1,
  303.         2,
  304.         3,
  305.         sys.maxint - 1,
  306.         sys.maxint,
  307.         sys.maxint + 1]
  308.     sqrt = int(math.sqrt(sys.maxint))
  309.     special.extend([
  310.         sqrt - 1,
  311.         sqrt,
  312.         sqrt + 1])
  313.     []([ -i for i in special ])
  314.     
  315.     def checkit(*args):
  316.         verify(got == expected, 'for %r expected %r got %r' % (args, expected, got))
  317.  
  318.     for x in special:
  319.         longx = long(x)
  320.         expected = -longx
  321.         got = -x
  322.         checkit('-', x)
  323.         for y in special:
  324.             longy = long(y)
  325.             expected = longx + longy
  326.             got = x + y
  327.             checkit(x, '+', y)
  328.             expected = longx - longy
  329.             got = x - y
  330.             checkit(x, '-', y)
  331.             expected = longx * longy
  332.             got = x * y
  333.             checkit(x, '*', y)
  334.             if abs(y) < 5:
  335.                 pass
  336.             None if x == 0 else None if y else special.extend
  337.         
  338.     
  339.  
  340.  
  341. def test_float_overflow():
  342.     import math
  343.     if verbose:
  344.         print 'long->float overflow'
  345.     
  346.     for x in (-2.0, -1.0, 0.0, 1.0, 2.0):
  347.         verify(float(long(x)) == x)
  348.     
  349.     shuge = '12345' * 120
  350.     huge = 0x1L << 30000
  351.     mhuge = -huge
  352.     namespace = {
  353.         'huge': huge,
  354.         'mhuge': mhuge,
  355.         'shuge': shuge,
  356.         'math': math }
  357.     for test in [
  358.         'float(huge)',
  359.         'float(mhuge)',
  360.         'complex(huge)',
  361.         'complex(mhuge)',
  362.         'complex(huge, 1)',
  363.         'complex(mhuge, 1)',
  364.         'complex(1, huge)',
  365.         'complex(1, mhuge)',
  366.         '1. + huge',
  367.         'huge + 1.',
  368.         '1. + mhuge',
  369.         'mhuge + 1.',
  370.         '1. - huge',
  371.         'huge - 1.',
  372.         '1. - mhuge',
  373.         'mhuge - 1.',
  374.         '1. * huge',
  375.         'huge * 1.',
  376.         '1. * mhuge',
  377.         'mhuge * 1.',
  378.         '1. // huge',
  379.         'huge // 1.',
  380.         '1. // mhuge',
  381.         'mhuge // 1.',
  382.         '1. / huge',
  383.         'huge / 1.',
  384.         '1. / mhuge',
  385.         'mhuge / 1.',
  386.         '1. ** huge',
  387.         'huge ** 1.',
  388.         '1. ** mhuge',
  389.         'mhuge ** 1.',
  390.         'math.sin(huge)',
  391.         'math.sin(mhuge)',
  392.         'math.sqrt(huge)',
  393.         'math.sqrt(mhuge)',
  394.         'math.floor(huge)',
  395.         'math.floor(mhuge)']:
  396.         
  397.         try:
  398.             eval(test, namespace)
  399.         except OverflowError:
  400.             pass
  401.  
  402.         raise TestFailed('expected OverflowError from %s' % test)
  403.         if float(shuge) == int(shuge):
  404.             raise TestFailed('float(shuge) should not equal int(shuge)')
  405.             continue
  406.     
  407.  
  408.  
  409. def test_logs():
  410.     import math
  411.     if verbose:
  412.         print 'log and log10'
  413.     
  414.     LOG10E = math.log10(math.e)
  415.     for exp in range(10) + [
  416.         100,
  417.         1000,
  418.         10000]:
  419.         value = 10 ** exp
  420.         log10 = math.log10(value)
  421.         verify(fcmp(log10, exp) == 0)
  422.         expected = exp / LOG10E
  423.         log = math.log(value)
  424.         verify(fcmp(log, expected) == 0)
  425.     
  426.     for bad in (-(0x1L << 10000), -0x2L, 0x0L):
  427.         
  428.         try:
  429.             math.log(bad)
  430.             raise TestFailed('expected ValueError from log(<= 0)')
  431.         except ValueError:
  432.             pass
  433.  
  434.         
  435.         try:
  436.             math.log10(bad)
  437.             raise TestFailed('expected ValueError from log10(<= 0)')
  438.         continue
  439.         except ValueError:
  440.             continue
  441.         
  442.  
  443.     
  444.  
  445.  
  446. def test_mixed_compares():
  447.     import math
  448.     import sys
  449.     if verbose:
  450.         print 'mixed comparisons'
  451.     
  452.     
  453.     class Rat:
  454.         
  455.         def __init__(self, value):
  456.             if isinstance(value, (int, long)):
  457.                 self.n = value
  458.                 self.d = 1
  459.             elif isinstance(value, float):
  460.                 (f, e) = math.frexp(abs(value))
  461.                 if not f == 0:
  462.                     if f <= f:
  463.                         pass
  464.                     elif not f < 1.0:
  465.                         raise AssertionError
  466.                 CHUNK = 28
  467.                 top = 0
  468.                 while f:
  469.                     f = math.ldexp(f, CHUNK)
  470.                     digit = int(f)
  471.                     if not digit >> CHUNK == 0:
  472.                         raise AssertionError
  473.                     top = top << CHUNK | digit
  474.                     f -= digit
  475.                     if f <= f:
  476.                         pass
  477.                     elif not f < 1.0:
  478.                         raise AssertionError
  479.                     e -= CHUNK
  480.                 if e >= 0:
  481.                     n = top << e
  482.                     d = 1
  483.                 else:
  484.                     n = top
  485.                     d = 1 << -e
  486.                 if value < 0:
  487.                     n = -n
  488.                 
  489.                 self.n = n
  490.                 self.d = d
  491.                 if not float(n) / float(d) == value:
  492.                     raise AssertionError
  493.             else:
  494.                 raise TypeError("can't deal with %r" % val)
  495.  
  496.         
  497.         def __cmp__(self, other):
  498.             if not isinstance(other, Rat):
  499.                 other = Rat(other)
  500.             
  501.             return cmp(self.n * other.d, self.d * other.n)
  502.  
  503.  
  504.     cases = [
  505.         0,
  506.         0.001,
  507.         0.98999999999999999,
  508.         1.0,
  509.         1.5,
  510.         1e+20,
  511.         9.9999999999999997e+199]
  512.     for t in (2.0 ** 48, 2.0 ** 50, 2.0 ** 53):
  513.         cases.extend([
  514.             t - 1.0,
  515.             t - 0.29999999999999999,
  516.             t,
  517.             t + 0.29999999999999999,
  518.             t + 1.0,
  519.             long(t - 1),
  520.             long(t),
  521.             long(t + 1)])
  522.     
  523.     cases.extend([
  524.         0,
  525.         1,
  526.         2,
  527.         sys.maxint,
  528.         float(sys.maxint)])
  529.     t = long(9.9999999999999997e+199)
  530.     cases.extend([
  531.         0x0L,
  532.         0x1L,
  533.         0x2L,
  534.         0x1L << 20000,
  535.         t - 1,
  536.         t,
  537.         t + 1])
  538.     []([ -x for x in cases ])
  539.     for x in cases:
  540.         Rx = Rat(x)
  541.         for y in cases:
  542.             Ry = Rat(y)
  543.             Rcmp = cmp(Rx, Ry)
  544.             xycmp = cmp(x, y)
  545.             if x == y != Rcmp == 0:
  546.                 raise TestFailed('%r == %r %d' % (x, y, Rcmp))
  547.             
  548.             if x != y != Rcmp != 0:
  549.                 raise TestFailed('%r != %r %d' % (x, y, Rcmp))
  550.             
  551.             if x < y != Rcmp < 0:
  552.                 raise TestFailed('%r < %r %d' % (x, y, Rcmp))
  553.             
  554.             if x <= y != Rcmp <= 0:
  555.                 raise TestFailed('%r <= %r %d' % (x, y, Rcmp))
  556.             
  557.             if (x > y) != (Rcmp > 0):
  558.                 raise TestFailed('%r > %r %d' % (x, y, Rcmp))
  559.             
  560.             if (x >= y) != (Rcmp >= 0):
  561.                 raise TestFailed('%r >= %r %d' % (x, y, Rcmp))
  562.                 continue
  563.         
  564.     
  565.  
  566. test_division()
  567. test_karatsuba()
  568. test_bitop_identities()
  569. test_format()
  570. test_misc()
  571. test_auto_overflow()
  572. test_float_overflow()
  573. test_logs()
  574. test_mixed_compares()
  575.